Libraries

RNAseq_Koichi <- read.csv("/media/alexis/DATA/Koichi_gene_expression_analyses_git/Koichi_gene_expression_analyses/DATA/RNAseq_parsed.csv", row.names = 1, header = T, check.names = F)

IDH_Koichi_TF_actitity_regulonlaml <- read.table("~/GitHub/Thesis_paper/Results/DGEA/TF_activities_tables/Koichi_TF_activities_Regulonlaml.tsv", 
                                                sep = "\t", check.names = F)
Clinical_patient_data <- read.table("~/GitHub/Thesis_paper/Datasets/Clinical_Koichi_data_isoform.tsv", sep = "\t", header = T)

Clinical_patient_data$Baseline_phenotype <- sapply(Clinical_patient_data$Best_response, function(resp){
  switch(resp,
         "CR" = "Responder",
         "CRi" = "Responder",
         "CRp" = "Intermediate_Responder",
         "HI" = "Intermediate_Responder",
         "MLFS" = "Intermediate_Responder",
         "Not_assessed" = "Not_assessed",
         "PD" = "Non_Responder",
         "PR" = "Intermediate_Responder",
         "SD" = "Non_Responder",
         "NA" = "Control"
         )
})

RNAseq_Koichi_Baseline <- RNAseq_Koichi[stringr::str_detect(colnames(RNAseq_Koichi), pattern="BL")]
Phenos <- lapply(colnames(IDH_Koichi_TF_actitity_regulonlaml), function(sample){
  tmp <- dplyr::filter(Clinical_patient_data, Baseline_RNAseq_data == sample)
  list("Response" = tmp$Baseline_phenotype,
       "Cluster" = tmp$Cluster,
       "IDH" = tmp$IDH_isoform,
       "IDH_1_2" = tmp$IDH_isoform %>% stringr::str_remove("_R172") %>% stringr::str_remove("_R140"))
}) %>% data.table::rbindlist()
rownames(Phenos) <- colnames(IDH_Koichi_TF_actitity_regulonlaml) 
Make_PCA_pheno <- function(data, pheno){
  data <- data[!is.na(pheno)]
  pheno <- pheno[!is.na(pheno)]
  res.pca <- prcomp(t(data))
  p <- fviz_pca_ind(res.pca, label="all", habillage=pheno, addEllipses=T, ellipse.level=0.95)
  p <- p + ggtitle("PCA Transcripto")
  p
}
Make_PCA_pheno(RNAseq_Koichi_Baseline, Phenos$Response)

Make_PCA_pheno(IDH_Koichi_TF_actitity_regulonlaml, Phenos$Response)

Make_PCA_pheno(RNAseq_Koichi_Baseline, Phenos$IDH)

Make_PCA_pheno(IDH_Koichi_TF_actitity_regulonlaml, Phenos$IDH)

Make_heatmap <- function(DATA, Phenotype, method = "pearson", 
                         title, annotation_color, kmeans_k = NA, cuttree = NA, corr=T) {
  if(corr){
    corr <- rcorr(as.matrix(DATA), type = method)$r
    colnames(corr) <- colnames(DATA)
  }else{
    corr <- DATA
  }
  title <- paste0(title, " ", method)
  heatmap <- pheatmap(corr, 
                      color = colorRampPalette(brewer.pal(n = 9, name = "YlOrRd"))(100),
                      annotation_col = Phenotype,
                      annotation_colors = annotation_color,
                      legend = TRUE, scale = "none",
                      treeheight_row = 20,
                      main = title, 
                      fontsize = 10,
                      cutree_cols = cuttree
  )
  return(heatmap)
}
Annotation_color <-  list(
    Response = c(Non_Responder = "red", Responder = "green", Intermediate_Responder = "orange"),
    Cluster = c(Cluster_R = "green", Cluster_NR = "red", No_clustered = "grey"),
    IDH = c(IDH1 = "blue", IDH2_R140 = "pink", IDH2_R172 = "yellow"))

Datas <- list("RNAseq" = RNAseq_Koichi_Baseline,
              "TF_activity" = IDH_Koichi_TF_actitity_regulonlaml)

names(Datas) %>% lapply(function(name_data){
  data <- Datas[[name_data]]
  Var_data <- rowVars(as.matrix(data))
  names(Var_data) <- rownames(data)
  pourcent_elem <- c(1, 5, 10, 50, 100)
  method = c("pearson","spearman")
  res <- lapply(method, function(meth){
    plots_pearson <- lapply(pourcent_elem, function(percent){
      nb_elem <- percent*nrow(data)%/%100 
      Top_var <- Var_data[order(Var_data, decreasing = T)] %>% .[1:nb_elem]
      Top_Var_data <- data %>% .[rownames(.) %in% names(Top_var),]
      heat <- Make_heatmap(Top_Var_data, Phenos, title = paste0(percent, "% of element"), 
                           annotation_color = Annotation_color, method = meth)
      pca_p <- Make_PCA_pheno(Top_Var_data, Phenos$Cluster)
      list(heat, pca_p)
    })
  })
  
  lm <- rbind(c(1,2),
           c(3, 5),
           c(4, 5),
           c(6, 7),
           c(8, 10),
           c(9, 10))
  gri <- grid.arrange(grobs = list(as.grob(res[[1]][[1]][[1]]), as.grob(res[[1]][[2]][[1]]),
                            as.grob(res[[1]][[3]][[1]]), as.grob(res[[1]][[4]][[1]]),
                            as.grob(res[[1]][[5]][[1]]),
                            as.grob(res[[2]][[1]][[1]]), as.grob(res[[2]][[2]][[1]]),
                            as.grob(res[[2]][[3]][[1]]), as.grob(res[[2]][[4]][[1]]),
                            as.grob(res[[2]][[5]][[1]])),
               layout_matrix = lm)
  ggsave(paste0("~/GitHub/Thesis_paper/Results/Transcriptomique/Heatmap_", name_data, ".png"), gri, bg = "white", width = 7600, height = 8400, units = "px")

})
[[1]]
[1] "~/GitHub/Thesis_paper/Results/Transcriptomique/Heatmap_RNAseq.png"

[[2]]
[1] "~/GitHub/Thesis_paper/Results/Transcriptomique/Heatmap_TF_activity.png"

Differential gene expression analysis

mart <- useMart('ENSEMBL_MART_ENSEMBL')
mart <- useDataset('hsapiens_gene_ensembl', mart)

attrmart <- listAttributes(mart)

annotLookup <- getBM(
  mart = mart,
  attributes = c(
    'hgnc_symbol',
    'entrezgene_id', 
    'ensembl_gene_id'),
  uniqueRows = TRUE)
DEGs_IDH2s <- Differential_analysis(Focused_variable = Phenos$IDH, DATA = RNAseq_Koichi_Baseline)
1 done
2 done
3 done
DEGs_IDH <- Differential_analysis(Focused_variable = Phenos$IDH_1_2, DATA = RNAseq_Koichi_Baseline) %>% .$`IDH1-IDH2` %>% merge(annotLookup, by.x = 0, by.y = "hgnc_symbol")
1 done
Volcano_IDH1_IDH2 <- EnhancedVolcano(
      toptable = DEGs_IDH,
      lab = DEGs_IDH$ID,
      x = "logFC",
      y = "P.Value",
      FCcutoff = 1.5,
      pCutoff = 0.05,
      title = "IDH1 vs IDH2",
      subtitle = NA,
      subtitleLabSize = 0, ylim = c(0, 5)
  )
Volcano_IDH2_R140_IDH2_R172 <- EnhancedVolcano(
      toptable = DEGs_IDH2s$`IDH2_R140-IDH2_R172`,
      lab = DEGs_IDH2s$`IDH2_R140-IDH2_R172`$ID,
      x = "logFC",
      y = "P.Value",
      FCcutoff = 1.5,
      pCutoff = 0.05,
      title = "IDH2 R140 vs IDH2 R172",
      subtitle = NA,
      subtitleLabSize = 0, ylim = c(0, 5)
  )

Volcano_IDH1_IDH2 %>% ggsave(filename = "~/GitHub/Thesis_paper/Results/Transcriptomique/Volcano_plot_IDH1_vs_IDH2.png", bg = "white", width = 7600, height = 4200, units = "px")
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Avis dans grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  Unable to calculate text width/height (using zero)
Volcano_IDH2_R140_IDH2_R172

Gene set enrichment

GO

mart <- biomaRt::useMart(biomart = "ENSEMBL_MART_ENSEMBL",
                         dataset = "hsapiens_gene_ensembl")

genes <- getBM(filters = "hgnc_symbol",
               attributes = c("hgnc_symbol","entrezgene_id"),
               values = rownames(RNAseq_Koichi_Baseline), 
               mart = mart) 

RNAseq_data_Entrezid <- merge(RNAseq_Koichi_Baseline, genes, by.x = 0, by.y = "hgnc_symbol", all.y = F, all.x = F)

genesets_list <- colnames(RNAseq_Koichi_Baseline) %>% 
  lapply(function(sample){
    values <- RNAseq_data_Entrezid[sample] %>% c %>% .[[1]]
    names(values) <- RNAseq_data_Entrezid$entrezgene_id
    values[order(values, decreasing = T)]
  })
names(genesets_list) <- colnames(RNAseq_Koichi_Baseline)
divide_fun <- function(a,b){
  n_samples <- length(b)
  a/n_samples
}

Geneset_phenos <- Phenos$IDH_1_2 %>% unique %>% lapply(function(pheno){
  samples <- colnames(RNAseq_Koichi_Baseline) %>% .[Phenos$IDH_1_2 == pheno]
  genelist <- lapply(samples, function(sample){
    genesets_list[[sample]]
  }) 
  purrr::reduce(genelist, `+`) %>% divide_fun(., samples)
})
names(Geneset_phenos) <- Phenos$IDH_1_2 %>% unique
  
ego <- lapply(names(Geneset_phenos), function(sample){
  gseGO(geneList     = Geneset_phenos[[sample]],
              OrgDb        = org.Hs.eg.db, 
              keyType = "ENTREZID",
              ont          = "all",
              minGSSize    = 20,
              maxGSSize    = 100,
              pvalueCutoff = 0.01,
              verbose      = T)
})
names(ego) <-  Phenos$IDH_1_2 %>% unique

Geneset_phenos_Response <- Phenos$Response %>% unique %>% lapply(function(pheno){
  samples <- colnames(RNAseq_Koichi_Baseline) %>% .[Phenos$Response == pheno]
  genelist <- lapply(samples, function(sample){
    genesets_list[[sample]]
  }) 
  purrr::reduce(genelist, `+`) %>% divide_fun(., samples)
})
names(Geneset_phenos_Response) <- Phenos$Response %>% unique

ego_Response <- lapply(names(Geneset_phenos_Response), function(sample){
  gseGO(geneList     = Geneset_phenos_Response[[sample]],
              OrgDb        = org.Hs.eg.db, 
              keyType = "ENTREZID",
              ont          = "all",
              minGSSize    = 20,
              maxGSSize    = 100,
              pvalueCutoff = 0.01,
              verbose      = T)
})
names(ego_Response) <-  Phenos$Response %>% unique
Geneset_IDH1_vs_IDH2 <- DEGs_IDH$logFC
names(Geneset_IDH1_vs_IDH2) <- DEGs_IDH$entrezgene_id
Geneset_IDH1_vs_IDH2 <- Geneset_IDH1_vs_IDH2[order(Geneset_IDH1_vs_IDH2, decreasing = T)]
GSEA_IDH1_IDH2 <- gseGO(geneList     = Geneset_IDH1_vs_IDH2,
              OrgDb        = org.Hs.eg.db, 
              keyType = "ENTREZID",
              ont          = "all",
              minGSSize    = 1,
              maxGSSize    = 1000,
              pvalueCutoff = 0.1,
              verbose      = T) %>%
  setReadable(OrgDb = org.Hs.eg.db, keyType = "ENTREZID")
dotplot(GSEA_IDH1_IDH2, split=".sign") + facet_grid(.~.sign)

ggsave("~/GitHub/Thesis_paper/Results/Transcriptomique/GO_enrichment_IDH1_vs_IDH2.png", bg = "white", width = 7600, height = 4200, units = "px")


cnetplot(GSEA_IDH1_IDH2, foldChange=Geneset_IDH1_vs_IDH2, node_label = "all") 
Avis dans cnetplot.enrichResult(x, ...) :
  Use 'color.params = list(foldChange = your_value)' instead of 'foldChange'.
 The foldChange parameter will be removed in the next version.
Scale for size is already present.
Adding another scale for size, which will replace the existing scale.
Avis : ggrepel: 73 unlabeled data points (too many overlaps). Consider increasing max.overlaps
ggsave("~/GitHub/Thesis_paper/Results/Transcriptomique/GO_cnetplot_enrichment_IDH1_vs_IDH2.png", bg = "white", width = 7600, height = 4200, units = "px")

Go_similarities_IDH1_vs_IDH2 <- GO_similarity(GSEA_IDH1_IDH2@result$ID, ont = "BP")
29/134 GO terms are removed.
simplifyGO(Go_similarities_IDH1_vs_IDH2)
Cluster 105 terms by 'binary_cut'... 14 clusters, used 0.7706757 secs.
'magick' package is suggested to install to give better rasterization.

Set `ht_opt$message = FALSE` to turn off this message.
Perform keywords enrichment for 14 GO lists...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...




































































































keyword enrichment, 100/3259...



































































































keyword enrichment, 200/3259...



































































































keyword enrichment, 300/3259...



































































































keyword enrichment, 400/3259...



































































































keyword enrichment, 500/3259...



































































































keyword enrichment, 600/3259...



































































































keyword enrichment, 700/3259...



































































































keyword enrichment, 800/3259...



































































































keyword enrichment, 900/3259...



































































































keyword enrichment, 1000/3259...



































































































keyword enrichment, 1100/3259...



































































































keyword enrichment, 1200/3259...



































































































keyword enrichment, 1300/3259...



































































































keyword enrichment, 1400/3259...



































































































keyword enrichment, 1500/3259...



































































































keyword enrichment, 1600/3259...



































































































keyword enrichment, 1700/3259...



































































































keyword enrichment, 1800/3259...



































































































keyword enrichment, 1900/3259...



































































































keyword enrichment, 2000/3259...



































































































keyword enrichment, 2100/3259...



































































































keyword enrichment, 2200/3259...



































































































keyword enrichment, 2300/3259...



































































































keyword enrichment, 2400/3259...



































































































keyword enrichment, 2500/3259...



































































































keyword enrichment, 2600/3259...



































































































keyword enrichment, 2700/3259...



































































































keyword enrichment, 2800/3259...



































































































keyword enrichment, 2900/3259...



































































































keyword enrichment, 3000/3259...



































































































keyword enrichment, 3100/3259...



































































































keyword enrichment, 3200/3259...



































































































keyword enrichment, 3259/3259...

# Simplify_GO_IDH2 <- simplifyGO(Go_similarities$IDH2)
# Simplify_GO_IDH1 <- simplifyGO(Go_similarities$IDH1)
lt <- list("IDH2" = ego$IDH2@result,
           "IDH1" = ego$IDH1@result
           )
simplifyGOFromMultipleLists_result <- simplifyGOFromMultipleLists(lt, padj_cutoff = 0.001, ont = "BP")
simplifyGOFromMultipleLists_result <- simplifyGOFromMultipleLists(lt, padj_cutoff = 0.001, ont = "CC")
simplifyGOFromMultipleLists_result <- simplifyGOFromMultipleLists(lt, padj_cutoff = 0.001, ont = "MF")

GO

dotplot(ego$IDH1)
dotplot(ego$IDH2)

KEGG

hsa00983 <- pathview(gene.data  = Geneset_IDH1_vs_IDH2,
                     pathway.id = "hsa00983",
                     species    = "hsa",
                     limit      = list(gene=max(abs(Geneset_IDH1_vs_IDH2)), cpd=1))
Info: Downloading xml files for hsa00983, 1/1 pathways..
Info: Downloading png files for hsa00983, 1/1 pathways..
'select()' returned 1:1 mapping
between keys and columns
Info: Working in directory /home/alexis/GitHub/Thesis_paper/Scripts/Transcriptomique
Info: Writing image file hsa00983.pathview.png
cnetplot(KEGG_IDH, foldChange=Geneset_IDH1_vs_IDH2, node_label = "all") 
Avis dans cnetplot.enrichResult(x, ...) :
  Use 'color.params = list(foldChange = your_value)' instead of 'foldChange'.
 The foldChange parameter will be removed in the next version.
Scale for size is already present.
Adding another scale for size, which will replace the existing scale.
Avis : ggrepel: 241 unlabeled data points (too many overlaps). Consider increasing max.overlaps

cnetplot(KEGG_IDH, foldChange=Geneset_IDH1_vs_IDH2, node_label = "all") 
Avis dans cnetplot.enrichResult(x, ...) :
  Use 'color.params = list(foldChange = your_value)' instead of 'foldChange'.
 The foldChange parameter will be removed in the next version.
Scale for size is already present.
Adding another scale for size, which will replace the existing scale.
Avis : ggrepel: 241 unlabeled data points (too many overlaps). Consider increasing max.overlaps
ggsave("~/GitHub/Thesis_paper/Results/Transcriptomique/KEGG_cnetplot_enrichment_IDH1_vs_IDH2.png", bg = "white", width = 7600, height = 4200, units = "px")

IDH_MKEGG <- gseMKEGG(geneList = Geneset_IDH1_vs_IDH2,
                 organism = 'hsa',
                 pvalueCutoff = 1) %>%
  setReadable(OrgDb = org.Hs.eg.db, keyType = "ENTREZID")
Reading KEGG annotation online: "https://rest.kegg.jp/link/hsa/module"...
Reading KEGG annotation online: "https://rest.kegg.jp/list/module"...
preparing geneSet collections...
GSEA analysis...
Avis dans preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (19.46% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Avis dans preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are duplicate gene names, fgsea may produce unexpected results.
leading edge analysis...
done...
dotplot(IDH_MKEGG, split=".sign") + facet_grid(.~.sign)

ggsave("~/GitHub/Thesis_paper/Results/Transcriptomique/MKEGG_enrichment_IDH1_vs_IDH2.png", bg = "white", width = 7600, height = 4200, units = "px")


cnetplot(IDH_MKEGG, foldChange=Geneset_IDH1_vs_IDH2, node_label = "all") 
Avis dans cnetplot.enrichResult(x, ...) :
  Use 'color.params = list(foldChange = your_value)' instead of 'foldChange'.
 The foldChange parameter will be removed in the next version.
Scale for size is already present.
Adding another scale for size, which will replace the existing scale.
ggsave("~/GitHub/Thesis_paper/Results/Transcriptomique/MKEGG_cnetplot_enrichment_IDH1_vs_IDH2.png", bg = "white", width = 7600, height = 4200, units = "px")

Wikipathway

IDH_WIKI <- gseWP(geneList = Geneset_IDH1_vs_IDH2,
                 organism = 'Homo sapiens',
                 pvalueCutoff = 1)  %>%
  setReadable(OrgDb = org.Hs.eg.db, keyType = "ENTREZID")
preparing geneSet collections...
GSEA analysis...
Avis dans preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (19.46% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Avis dans preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are duplicate gene names, fgsea may produce unexpected results.
leading edge analysis...
done...
cnetplot(IDH_WIKI, foldChange=Geneset_IDH1_vs_IDH2, node_label = "all") 
Avis dans cnetplot.enrichResult(x, ...) :
  Use 'color.params = list(foldChange = your_value)' instead of 'foldChange'.
 The foldChange parameter will be removed in the next version.
Scale for size is already present.
Adding another scale for size, which will replace the existing scale.
Avis : ggrepel: 3 unlabeled data points (too many overlaps). Consider increasing max.overlaps

Overrepresentation

IDH1_vs_IDH2_UP <- DEGs_IDH %>% dplyr::filter(logFC > 1.5 & P.Value < 0.05) %>% .$ID %>% unique
IDH1_vs_IDH2_DOWN <- DEGs_IDH %>% dplyr::filter(logFC < -1.5 & P.Value < 0.05) %>% .$ID %>% unique

GO

IDH1_vs_IDH2_UP_GO <- enrichGO(IDH1_vs_IDH2_UP, OrgDb = org.Hs.eg.db, universe = DEGs_IDH$ID, keyType = "SYMBOL", pvalueCutoff = 0.05)
IDH1_vs_IDH2_DOWN_GO <- enrichGO(IDH1_vs_IDH2_DOWN, OrgDb = org.Hs.eg.db, universe = DEGs_IDH$ID, keyType = "SYMBOL", pvalueCutoff = 0.05)
dotplot(IDH1_vs_IDH2_UP_GO, split=".sign") + facet_grid(.~.sign) 
Erreur dans `[.data.frame`(res, , split) : 
  colonnes non définies sélectionnées

KEGG

Overrepresented_IDH1 <- dplyr::filter(annotLookup, hgnc_symbol %in% IDH1_vs_IDH2_UP) %>% 
  .$entrezgene_id %>% unique
Overrepresented_IDH2 <- dplyr::filter(annotLookup, hgnc_symbol %in% IDH1_vs_IDH2_DOWN) %>% 
  .$entrezgene_id %>% unique
universe_entrez <- dplyr::filter(annotLookup, hgnc_symbol %in% rownames(RNAseq_Koichi_Baseline)) %>% 
  .$entrezgene_id %>% unique %>% as.character()
IDH1_vs_IDH2_UP_KEGG <- enrichKEGG(Overrepresented_IDH1, organism = "hsa", universe = universe_entrez) %>%
  setReadable(OrgDb = org.Hs.eg.db, keyType = "ENTREZID")
Reading KEGG annotation online: "https://rest.kegg.jp/link/hsa/pathway"...
Reading KEGG annotation online: "https://rest.kegg.jp/list/pathway/hsa"...
IDH1_vs_IDH2_DOWN_KEGG <- enrichKEGG(Overrepresented_IDH2, organism = "hsa", universe = universe_entrez) %>%
  setReadable(OrgDb = org.Hs.eg.db, keyType = "ENTREZID")
dotplot(IDH1_vs_IDH2_UP_KEGG)

dotplot(IDH1_vs_IDH2_DOWN_KEGG) 
Avis dans rep(yes, length.out = len) :
  'x' is NULL so the result will be NULL
Erreur dans ans[ypos] <- rep(yes, length.out = len)[ypos] : 
  l'argument de remplacement est de longueur nulle

Wikipathway

IDH1_vs_IDH2_WIKIPATH_over_up <- enrichWP(Overrepresented_IDH1, organism = "Homo sapiens")
IDH1_vs_IDH2_WIKIPATH_over_down <- enrichWP(Overrepresented_IDH2, organism = "Homo sapiens")

write.table(GSEA_IDH1_IDH2@result, "~/GitHub/Thesis_paper/Results/Transcriptomique/GO_enrichment_IDH1_vs_IDH2.tsv", sep = "\t")
write.table(KEGG_IDH@result, "~/GitHub/Thesis_paper/Results/Transcriptomique/KEGG_enrichment_IDH1_vs_IDH2.tsv", sep = "\t")
write.table(IDH_MKEGG@result, "~/GitHub/Thesis_paper/Results/Transcriptomique/MKEGG_enrichment_IDH1_vs_IDH2.tsv", sep = "\t")
write.table(IDH_WIKI@result, "~/GitHub/Thesis_paper/Results/Transcriptomique/WIKI_enrichment_IDH1_vs_IDH2.tsv", sep = "\t")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBMaWJyYXJpZXMKCmBgYHtyLCBlcnJvcj1GLCB3YXJuaW5nPUYsIGVjaG89RkFMU0UsIGluY2x1ZGU9Rn0KbGlicmFyeShkcGx5cikKbGlicmFyeShtYXRyaXhUZXN0cykKbGlicmFyeShmYWN0b2V4dHJhKQpsaWJyYXJ5KEhtaXNjKQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShwaGVhdG1hcCkKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHBhcmFsbGVsKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeSgiZ3JpZCIpCmxpYnJhcnkoImdyaWRFeHRyYSIpCmxpYnJhcnkoZ2dwbG90aWZ5KQpsaWJyYXJ5KGxpbW1hKQpsaWJyYXJ5KEVuaGFuY2VkVm9sY2FubykKbGlicmFyeShiaW9tYVJ0KQpsaWJyYXJ5KGNsdXN0ZXJQcm9maWxlcikKbGlicmFyeShvcmcuSHMuZWcuZGIpCmxpYnJhcnkoc2ltcGxpZnlFbnJpY2htZW50KQpsaWJyYXJ5KHBhdGh2aWV3KQoKCmNvcmVzMnVzZSA8LSBkZXRlY3RDb3JlcygpIC0yCgoKc291cmNlKCJ+L0NvcmVfc2NyaXB0cy9jb3JlX2Z1bmN0aW9ucy5SIikKYGBgCgoKYGBge3J9ClJOQXNlcV9Lb2ljaGkgPC0gcmVhZC5jc3YoIi9tZWRpYS9hbGV4aXMvREFUQS9Lb2ljaGlfZ2VuZV9leHByZXNzaW9uX2FuYWx5c2VzX2dpdC9Lb2ljaGlfZ2VuZV9leHByZXNzaW9uX2FuYWx5c2VzL0RBVEEvUk5Bc2VxX3BhcnNlZC5jc3YiLCByb3cubmFtZXMgPSAxLCBoZWFkZXIgPSBULCBjaGVjay5uYW1lcyA9IEYpCgpJREhfS29pY2hpX1RGX2FjdGl0aXR5X3JlZ3Vsb25sYW1sIDwtIHJlYWQudGFibGUoIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL0RHRUEvVEZfYWN0aXZpdGllc190YWJsZXMvS29pY2hpX1RGX2FjdGl2aXRpZXNfUmVndWxvbmxhbWwudHN2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJcdCIsIGNoZWNrLm5hbWVzID0gRikKQ2xpbmljYWxfcGF0aWVudF9kYXRhIDwtIHJlYWQudGFibGUoIn4vR2l0SHViL1RoZXNpc19wYXBlci9EYXRhc2V0cy9DbGluaWNhbF9Lb2ljaGlfZGF0YV9pc29mb3JtLnRzdiIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFQpCgpDbGluaWNhbF9wYXRpZW50X2RhdGEkQmFzZWxpbmVfcGhlbm90eXBlIDwtIHNhcHBseShDbGluaWNhbF9wYXRpZW50X2RhdGEkQmVzdF9yZXNwb25zZSwgZnVuY3Rpb24ocmVzcCl7CiAgc3dpdGNoKHJlc3AsCiAgICAgICAgICJDUiIgPSAiUmVzcG9uZGVyIiwKICAgICAgICAgIkNSaSIgPSAiUmVzcG9uZGVyIiwKICAgICAgICAgIkNScCIgPSAiSW50ZXJtZWRpYXRlX1Jlc3BvbmRlciIsCiAgICAgICAgICJISSIgPSAiSW50ZXJtZWRpYXRlX1Jlc3BvbmRlciIsCiAgICAgICAgICJNTEZTIiA9ICJJbnRlcm1lZGlhdGVfUmVzcG9uZGVyIiwKICAgICAgICAgIk5vdF9hc3Nlc3NlZCIgPSAiTm90X2Fzc2Vzc2VkIiwKICAgICAgICAgIlBEIiA9ICJOb25fUmVzcG9uZGVyIiwKICAgICAgICAgIlBSIiA9ICJJbnRlcm1lZGlhdGVfUmVzcG9uZGVyIiwKICAgICAgICAgIlNEIiA9ICJOb25fUmVzcG9uZGVyIiwKICAgICAgICAgIk5BIiA9ICJDb250cm9sIgogICAgICAgICApCn0pCgpSTkFzZXFfS29pY2hpX0Jhc2VsaW5lIDwtIFJOQXNlcV9Lb2ljaGlbc3RyaW5ncjo6c3RyX2RldGVjdChjb2xuYW1lcyhSTkFzZXFfS29pY2hpKSwgcGF0dGVybj0iQkwiKV0KYGBgCgpgYGB7cn0KUGhlbm9zIDwtIGxhcHBseShjb2xuYW1lcyhJREhfS29pY2hpX1RGX2FjdGl0aXR5X3JlZ3Vsb25sYW1sKSwgZnVuY3Rpb24oc2FtcGxlKXsKICB0bXAgPC0gZHBseXI6OmZpbHRlcihDbGluaWNhbF9wYXRpZW50X2RhdGEsIEJhc2VsaW5lX1JOQXNlcV9kYXRhID09IHNhbXBsZSkKICBsaXN0KCJSZXNwb25zZSIgPSB0bXAkQmFzZWxpbmVfcGhlbm90eXBlLAogICAgICAgIkNsdXN0ZXIiID0gdG1wJENsdXN0ZXIsCiAgICAgICAiSURIIiA9IHRtcCRJREhfaXNvZm9ybSwKICAgICAgICJJREhfMV8yIiA9IHRtcCRJREhfaXNvZm9ybSAlPiUgc3RyaW5ncjo6c3RyX3JlbW92ZSgiX1IxNzIiKSAlPiUgc3RyaW5ncjo6c3RyX3JlbW92ZSgiX1IxNDAiKSkKfSkgJT4lIGRhdGEudGFibGU6OnJiaW5kbGlzdCgpCnJvd25hbWVzKFBoZW5vcykgPC0gY29sbmFtZXMoSURIX0tvaWNoaV9URl9hY3RpdGl0eV9yZWd1bG9ubGFtbCkgCmBgYAoKCmBgYHtyfQpNYWtlX1BDQV9waGVubyA8LSBmdW5jdGlvbihkYXRhLCBwaGVubyl7CiAgZGF0YSA8LSBkYXRhWyFpcy5uYShwaGVubyldCiAgcGhlbm8gPC0gcGhlbm9bIWlzLm5hKHBoZW5vKV0KICByZXMucGNhIDwtIHByY29tcCh0KGRhdGEpKQogIHAgPC0gZnZpel9wY2FfaW5kKHJlcy5wY2EsIGxhYmVsPSJhbGwiLCBoYWJpbGxhZ2U9cGhlbm8sIGFkZEVsbGlwc2VzPVQsIGVsbGlwc2UubGV2ZWw9MC45NSkKICBwIDwtIHAgKyBnZ3RpdGxlKCJQQ0EgVHJhbnNjcmlwdG8iKQogIHAKfQpgYGAKCmBgYHtyfQpNYWtlX1BDQV9waGVubyhSTkFzZXFfS29pY2hpX0Jhc2VsaW5lLCBQaGVub3MkUmVzcG9uc2UpCk1ha2VfUENBX3BoZW5vKElESF9Lb2ljaGlfVEZfYWN0aXRpdHlfcmVndWxvbmxhbWwsIFBoZW5vcyRSZXNwb25zZSkKTWFrZV9QQ0FfcGhlbm8oUk5Bc2VxX0tvaWNoaV9CYXNlbGluZSwgUGhlbm9zJElESCkKTWFrZV9QQ0FfcGhlbm8oSURIX0tvaWNoaV9URl9hY3RpdGl0eV9yZWd1bG9ubGFtbCwgUGhlbm9zJElESCkKYGBgCgpgYGB7cn0KTWFrZV9oZWF0bWFwIDwtIGZ1bmN0aW9uKERBVEEsIFBoZW5vdHlwZSwgbWV0aG9kID0gInBlYXJzb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLCBhbm5vdGF0aW9uX2NvbG9yLCBrbWVhbnNfayA9IE5BLCBjdXR0cmVlID0gTkEsIGNvcnI9VCkgewogIGlmKGNvcnIpewogICAgY29yciA8LSByY29ycihhcy5tYXRyaXgoREFUQSksIHR5cGUgPSBtZXRob2QpJHIKICAgIGNvbG5hbWVzKGNvcnIpIDwtIGNvbG5hbWVzKERBVEEpCiAgfWVsc2V7CiAgICBjb3JyIDwtIERBVEEKICB9CiAgdGl0bGUgPC0gcGFzdGUwKHRpdGxlLCAiICIsIG1ldGhvZCkKICBoZWF0bWFwIDwtIHBoZWF0bWFwKGNvcnIsIAogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiWWxPclJkIikpKDEwMCksCiAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IFBoZW5vdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZCA9IFRSVUUsIHNjYWxlID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgdHJlZWhlaWdodF9yb3cgPSAyMCwKICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSB0aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICBmb250c2l6ZSA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgY3V0cmVlX2NvbHMgPSBjdXR0cmVlCiAgKQogIHJldHVybihoZWF0bWFwKQp9CmBgYAoKYGBge3J9CkFubm90YXRpb25fY29sb3IgPC0gIGxpc3QoCiAgICBSZXNwb25zZSA9IGMoTm9uX1Jlc3BvbmRlciA9ICJyZWQiLCBSZXNwb25kZXIgPSAiZ3JlZW4iLCBJbnRlcm1lZGlhdGVfUmVzcG9uZGVyID0gIm9yYW5nZSIpLAogICAgQ2x1c3RlciA9IGMoQ2x1c3Rlcl9SID0gImdyZWVuIiwgQ2x1c3Rlcl9OUiA9ICJyZWQiLCBOb19jbHVzdGVyZWQgPSAiZ3JleSIpLAogICAgSURIID0gYyhJREgxID0gImJsdWUiLCBJREgyX1IxNDAgPSAicGluayIsIElESDJfUjE3MiA9ICJ5ZWxsb3ciKSkKCkRhdGFzIDwtIGxpc3QoIlJOQXNlcSIgPSBSTkFzZXFfS29pY2hpX0Jhc2VsaW5lLAogICAgICAgICAgICAgICJURl9hY3Rpdml0eSIgPSBJREhfS29pY2hpX1RGX2FjdGl0aXR5X3JlZ3Vsb25sYW1sKQoKbmFtZXMoRGF0YXMpICU+JSBsYXBwbHkoZnVuY3Rpb24obmFtZV9kYXRhKXsKICBkYXRhIDwtIERhdGFzW1tuYW1lX2RhdGFdXQogIFZhcl9kYXRhIDwtIHJvd1ZhcnMoYXMubWF0cml4KGRhdGEpKQogIG5hbWVzKFZhcl9kYXRhKSA8LSByb3duYW1lcyhkYXRhKQogIHBvdXJjZW50X2VsZW0gPC0gYygxLCA1LCAxMCwgNTAsIDEwMCkKICBtZXRob2QgPSBjKCJwZWFyc29uIiwic3BlYXJtYW4iKQogIHJlcyA8LSBsYXBwbHkobWV0aG9kLCBmdW5jdGlvbihtZXRoKXsKICAgIHBsb3RzX3BlYXJzb24gPC0gbGFwcGx5KHBvdXJjZW50X2VsZW0sIGZ1bmN0aW9uKHBlcmNlbnQpewogICAgICBuYl9lbGVtIDwtIHBlcmNlbnQqbnJvdyhkYXRhKSUvJTEwMCAKICAgICAgVG9wX3ZhciA8LSBWYXJfZGF0YVtvcmRlcihWYXJfZGF0YSwgZGVjcmVhc2luZyA9IFQpXSAlPiUgLlsxOm5iX2VsZW1dCiAgICAgIFRvcF9WYXJfZGF0YSA8LSBkYXRhICU+JSAuW3Jvd25hbWVzKC4pICVpbiUgbmFtZXMoVG9wX3ZhciksXQogICAgICBoZWF0IDwtIE1ha2VfaGVhdG1hcChUb3BfVmFyX2RhdGEsIFBoZW5vcywgdGl0bGUgPSBwYXN0ZTAocGVyY2VudCwgIiUgb2YgZWxlbWVudCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvciA9IEFubm90YXRpb25fY29sb3IsIG1ldGhvZCA9IG1ldGgpCiAgICAgIHBjYV9wIDwtIE1ha2VfUENBX3BoZW5vKFRvcF9WYXJfZGF0YSwgUGhlbm9zJENsdXN0ZXIpCiAgICAgIGxpc3QoaGVhdCwgcGNhX3ApCiAgICB9KQogIH0pCiAgCiAgbG0gPC0gcmJpbmQoYygxLDIpLAogICAgICAgICAgIGMoMywgNSksCiAgICAgICAgICAgYyg0LCA1KSwKICAgICAgICAgICBjKDYsIDcpLAogICAgICAgICAgIGMoOCwgMTApLAogICAgICAgICAgIGMoOSwgMTApKQogIGdyaSA8LSBncmlkLmFycmFuZ2UoZ3JvYnMgPSBsaXN0KGFzLmdyb2IocmVzW1sxXV1bWzFdXVtbMV1dKSwgYXMuZ3JvYihyZXNbWzFdXVtbMl1dW1sxXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZ3JvYihyZXNbWzFdXVtbM11dW1sxXV0pLCBhcy5ncm9iKHJlc1tbMV1dW1s0XV1bWzFdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5ncm9iKHJlc1tbMV1dW1s1XV1bWzFdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5ncm9iKHJlc1tbMl1dW1sxXV1bWzFdXSksIGFzLmdyb2IocmVzW1syXV1bWzJdXVtbMV1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmdyb2IocmVzW1syXV1bWzNdXVtbMV1dKSwgYXMuZ3JvYihyZXNbWzJdXVtbNF1dW1sxXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZ3JvYihyZXNbWzJdXVtbNV1dW1sxXV0pKSwKICAgICAgICAgICAgICAgbGF5b3V0X21hdHJpeCA9IGxtKQogIGdnc2F2ZShwYXN0ZTAoIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL1RyYW5zY3JpcHRvbWlxdWUvSGVhdG1hcF8iLCBuYW1lX2RhdGEsICIucG5nIiksIGdyaSwgYmcgPSAid2hpdGUiLCB3aWR0aCA9IDc2MDAsIGhlaWdodCA9IDg0MDAsIHVuaXRzID0gInB4IikKCn0pCgoKYGBgCgojIERpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXMKCmBgYHtyfQptYXJ0IDwtIHVzZU1hcnQoJ0VOU0VNQkxfTUFSVF9FTlNFTUJMJykKbWFydCA8LSB1c2VEYXRhc2V0KCdoc2FwaWVuc19nZW5lX2Vuc2VtYmwnLCBtYXJ0KQoKYXR0cm1hcnQgPC0gbGlzdEF0dHJpYnV0ZXMobWFydCkKCmFubm90TG9va3VwIDwtIGdldEJNKAogIG1hcnQgPSBtYXJ0LAogIGF0dHJpYnV0ZXMgPSBjKAogICAgJ2hnbmNfc3ltYm9sJywKICAgICdlbnRyZXpnZW5lX2lkJywgCiAgICAnZW5zZW1ibF9nZW5lX2lkJyksCiAgdW5pcXVlUm93cyA9IFRSVUUpCmBgYAoKCmBgYHtyfQpERUdzX0lESDJzIDwtIERpZmZlcmVudGlhbF9hbmFseXNpcyhGb2N1c2VkX3ZhcmlhYmxlID0gUGhlbm9zJElESCwgREFUQSA9IFJOQXNlcV9Lb2ljaGlfQmFzZWxpbmUpCkRFR3NfSURIIDwtIERpZmZlcmVudGlhbF9hbmFseXNpcyhGb2N1c2VkX3ZhcmlhYmxlID0gUGhlbm9zJElESF8xXzIsIERBVEEgPSBSTkFzZXFfS29pY2hpX0Jhc2VsaW5lKSAlPiUgLiRgSURIMS1JREgyYCAlPiUgbWVyZ2UoYW5ub3RMb29rdXAsIGJ5LnggPSAwLCBieS55ID0gImhnbmNfc3ltYm9sIikKYGBgCgpgYGB7cn0KVm9sY2Fub19JREgxX0lESDIgPC0gRW5oYW5jZWRWb2xjYW5vKAogICAgICB0b3B0YWJsZSA9IERFR3NfSURILAogICAgICBsYWIgPSBERUdzX0lESCRJRCwKICAgICAgeCA9ICJsb2dGQyIsCiAgICAgIHkgPSAiUC5WYWx1ZSIsCiAgICAgIEZDY3V0b2ZmID0gMS41LAogICAgICBwQ3V0b2ZmID0gMC4wNSwKICAgICAgdGl0bGUgPSAiSURIMSB2cyBJREgyIiwKICAgICAgc3VidGl0bGUgPSBOQSwKICAgICAgc3VidGl0bGVMYWJTaXplID0gMCwgeWxpbSA9IGMoMCwgNSkKICApClZvbGNhbm9fSURIMl9SMTQwX0lESDJfUjE3MiA8LSBFbmhhbmNlZFZvbGNhbm8oCiAgICAgIHRvcHRhYmxlID0gREVHc19JREgycyRgSURIMl9SMTQwLUlESDJfUjE3MmAsCiAgICAgIGxhYiA9IERFR3NfSURIMnMkYElESDJfUjE0MC1JREgyX1IxNzJgJElELAogICAgICB4ID0gImxvZ0ZDIiwKICAgICAgeSA9ICJQLlZhbHVlIiwKICAgICAgRkNjdXRvZmYgPSAxLjUsCiAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICB0aXRsZSA9ICJJREgyIFIxNDAgdnMgSURIMiBSMTcyIiwKICAgICAgc3VidGl0bGUgPSBOQSwKICAgICAgc3VidGl0bGVMYWJTaXplID0gMCwgeWxpbSA9IGMoMCwgNSkKICApCgpWb2xjYW5vX0lESDFfSURIMiAlPiUgZ2dzYXZlKGZpbGVuYW1lID0gIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL1RyYW5zY3JpcHRvbWlxdWUvVm9sY2Fub19wbG90X0lESDFfdnNfSURIMi5wbmciLCBiZyA9ICJ3aGl0ZSIsIHdpZHRoID0gNzYwMCwgaGVpZ2h0ID0gNDIwMCwgdW5pdHMgPSAicHgiKQpWb2xjYW5vX0lESDJfUjE0MF9JREgyX1IxNzIKYGBgCgojIEdlbmUgc2V0IGVucmljaG1lbnQKCiMjIEdPCgpgYGB7ciwgZXZhbCA9IEZ9Cm1hcnQgPC0gYmlvbWFSdDo6dXNlTWFydChiaW9tYXJ0ID0gIkVOU0VNQkxfTUFSVF9FTlNFTUJMIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgPSAiaHNhcGllbnNfZ2VuZV9lbnNlbWJsIikKCmdlbmVzIDwtIGdldEJNKGZpbHRlcnMgPSAiaGduY19zeW1ib2wiLAogICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYygiaGduY19zeW1ib2wiLCJlbnRyZXpnZW5lX2lkIiksCiAgICAgICAgICAgICAgIHZhbHVlcyA9IHJvd25hbWVzKFJOQXNlcV9Lb2ljaGlfQmFzZWxpbmUpLCAKICAgICAgICAgICAgICAgbWFydCA9IG1hcnQpIAoKUk5Bc2VxX2RhdGFfRW50cmV6aWQgPC0gbWVyZ2UoUk5Bc2VxX0tvaWNoaV9CYXNlbGluZSwgZ2VuZXMsIGJ5LnggPSAwLCBieS55ID0gImhnbmNfc3ltYm9sIiwgYWxsLnkgPSBGLCBhbGwueCA9IEYpCgpnZW5lc2V0c19saXN0IDwtIGNvbG5hbWVzKFJOQXNlcV9Lb2ljaGlfQmFzZWxpbmUpICU+JSAKICBsYXBwbHkoZnVuY3Rpb24oc2FtcGxlKXsKICAgIHZhbHVlcyA8LSBSTkFzZXFfZGF0YV9FbnRyZXppZFtzYW1wbGVdICU+JSBjICU+JSAuW1sxXV0KICAgIG5hbWVzKHZhbHVlcykgPC0gUk5Bc2VxX2RhdGFfRW50cmV6aWQkZW50cmV6Z2VuZV9pZAogICAgdmFsdWVzW29yZGVyKHZhbHVlcywgZGVjcmVhc2luZyA9IFQpXQogIH0pCm5hbWVzKGdlbmVzZXRzX2xpc3QpIDwtIGNvbG5hbWVzKFJOQXNlcV9Lb2ljaGlfQmFzZWxpbmUpCmBgYAoKYGBge3IsIGV2YWwgPSBGfQpkaXZpZGVfZnVuIDwtIGZ1bmN0aW9uKGEsYil7CiAgbl9zYW1wbGVzIDwtIGxlbmd0aChiKQogIGEvbl9zYW1wbGVzCn0KCkdlbmVzZXRfcGhlbm9zIDwtIFBoZW5vcyRJREhfMV8yICU+JSB1bmlxdWUgJT4lIGxhcHBseShmdW5jdGlvbihwaGVubyl7CiAgc2FtcGxlcyA8LSBjb2xuYW1lcyhSTkFzZXFfS29pY2hpX0Jhc2VsaW5lKSAlPiUgLltQaGVub3MkSURIXzFfMiA9PSBwaGVub10KICBnZW5lbGlzdCA8LSBsYXBwbHkoc2FtcGxlcywgZnVuY3Rpb24oc2FtcGxlKXsKICAgIGdlbmVzZXRzX2xpc3RbW3NhbXBsZV1dCiAgfSkgCiAgcHVycnI6OnJlZHVjZShnZW5lbGlzdCwgYCtgKSAlPiUgZGl2aWRlX2Z1biguLCBzYW1wbGVzKQp9KQpuYW1lcyhHZW5lc2V0X3BoZW5vcykgPC0gUGhlbm9zJElESF8xXzIgJT4lIHVuaXF1ZQogIAplZ28gPC0gbGFwcGx5KG5hbWVzKEdlbmVzZXRfcGhlbm9zKSwgZnVuY3Rpb24oc2FtcGxlKXsKICBnc2VHTyhnZW5lTGlzdCAgICAgPSBHZW5lc2V0X3BoZW5vc1tbc2FtcGxlXV0sCiAgICAgICAgICAgICAgT3JnRGIgICAgICAgID0gb3JnLkhzLmVnLmRiLCAKICAgICAgICAgICAgICBrZXlUeXBlID0gIkVOVFJFWklEIiwKICAgICAgICAgICAgICBvbnQgICAgICAgICAgPSAiYWxsIiwKICAgICAgICAgICAgICBtaW5HU1NpemUgICAgPSAyMCwKICAgICAgICAgICAgICBtYXhHU1NpemUgICAgPSAxMDAsCiAgICAgICAgICAgICAgcHZhbHVlQ3V0b2ZmID0gMC4wMSwKICAgICAgICAgICAgICB2ZXJib3NlICAgICAgPSBUKQp9KQpuYW1lcyhlZ28pIDwtICBQaGVub3MkSURIXzFfMiAlPiUgdW5pcXVlCgpHZW5lc2V0X3BoZW5vc19SZXNwb25zZSA8LSBQaGVub3MkUmVzcG9uc2UgJT4lIHVuaXF1ZSAlPiUgbGFwcGx5KGZ1bmN0aW9uKHBoZW5vKXsKICBzYW1wbGVzIDwtIGNvbG5hbWVzKFJOQXNlcV9Lb2ljaGlfQmFzZWxpbmUpICU+JSAuW1BoZW5vcyRSZXNwb25zZSA9PSBwaGVub10KICBnZW5lbGlzdCA8LSBsYXBwbHkoc2FtcGxlcywgZnVuY3Rpb24oc2FtcGxlKXsKICAgIGdlbmVzZXRzX2xpc3RbW3NhbXBsZV1dCiAgfSkgCiAgcHVycnI6OnJlZHVjZShnZW5lbGlzdCwgYCtgKSAlPiUgZGl2aWRlX2Z1biguLCBzYW1wbGVzKQp9KQpuYW1lcyhHZW5lc2V0X3BoZW5vc19SZXNwb25zZSkgPC0gUGhlbm9zJFJlc3BvbnNlICU+JSB1bmlxdWUKCmVnb19SZXNwb25zZSA8LSBsYXBwbHkobmFtZXMoR2VuZXNldF9waGVub3NfUmVzcG9uc2UpLCBmdW5jdGlvbihzYW1wbGUpewogIGdzZUdPKGdlbmVMaXN0ICAgICA9IEdlbmVzZXRfcGhlbm9zX1Jlc3BvbnNlW1tzYW1wbGVdXSwKICAgICAgICAgICAgICBPcmdEYiAgICAgICAgPSBvcmcuSHMuZWcuZGIsIAogICAgICAgICAgICAgIGtleVR5cGUgPSAiRU5UUkVaSUQiLAogICAgICAgICAgICAgIG9udCAgICAgICAgICA9ICJhbGwiLAogICAgICAgICAgICAgIG1pbkdTU2l6ZSAgICA9IDIwLAogICAgICAgICAgICAgIG1heEdTU2l6ZSAgICA9IDEwMCwKICAgICAgICAgICAgICBwdmFsdWVDdXRvZmYgPSAwLjAxLAogICAgICAgICAgICAgIHZlcmJvc2UgICAgICA9IFQpCn0pCm5hbWVzKGVnb19SZXNwb25zZSkgPC0gIFBoZW5vcyRSZXNwb25zZSAlPiUgdW5pcXVlCmBgYAoKYGBge3J9CkdlbmVzZXRfSURIMV92c19JREgyIDwtIERFR3NfSURIJGxvZ0ZDCm5hbWVzKEdlbmVzZXRfSURIMV92c19JREgyKSA8LSBERUdzX0lESCRlbnRyZXpnZW5lX2lkCkdlbmVzZXRfSURIMV92c19JREgyIDwtIEdlbmVzZXRfSURIMV92c19JREgyW29yZGVyKEdlbmVzZXRfSURIMV92c19JREgyLCBkZWNyZWFzaW5nID0gVCldCmBgYAoKYGBge3J9CkdTRUFfSURIMV9JREgyIDwtIGdzZUdPKGdlbmVMaXN0ICAgICA9IEdlbmVzZXRfSURIMV92c19JREgyLAogICAgICAgICAgICAgIE9yZ0RiICAgICAgICA9IG9yZy5Icy5lZy5kYiwgCiAgICAgICAgICAgICAga2V5VHlwZSA9ICJFTlRSRVpJRCIsCiAgICAgICAgICAgICAgb250ICAgICAgICAgID0gImFsbCIsCiAgICAgICAgICAgICAgbWluR1NTaXplICAgID0gMSwKICAgICAgICAgICAgICBtYXhHU1NpemUgICAgPSAxMDAwLAogICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMSwKICAgICAgICAgICAgICB2ZXJib3NlICAgICAgPSBUKSAlPiUKICBzZXRSZWFkYWJsZShPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJFTlRSRVpJRCIpCgpgYGAKCmBgYHtyfQpkb3RwbG90KEdTRUFfSURIMV9JREgyLCBzcGxpdD0iLnNpZ24iKSArIGZhY2V0X2dyaWQoLn4uc2lnbikKCmdnc2F2ZSgifi9HaXRIdWIvVGhlc2lzX3BhcGVyL1Jlc3VsdHMvVHJhbnNjcmlwdG9taXF1ZS9HT19lbnJpY2htZW50X0lESDFfdnNfSURIMi5wbmciLCBiZyA9ICJ3aGl0ZSIsIHdpZHRoID0gNzYwMCwgaGVpZ2h0ID0gNDIwMCwgdW5pdHMgPSAicHgiKQoKY25ldHBsb3QoR1NFQV9JREgxX0lESDIsIGZvbGRDaGFuZ2U9R2VuZXNldF9JREgxX3ZzX0lESDIsIG5vZGVfbGFiZWwgPSAiYWxsIikgCgpnZ3NhdmUoIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL1RyYW5zY3JpcHRvbWlxdWUvR09fY25ldHBsb3RfZW5yaWNobWVudF9JREgxX3ZzX0lESDIucG5nIiwgYmcgPSAid2hpdGUiLCB3aWR0aCA9IDc2MDAsIGhlaWdodCA9IDQyMDAsIHVuaXRzID0gInB4IikKYGBgCgoKCmBgYHtyfQpHb19zaW1pbGFyaXRpZXNfSURIMV92c19JREgyIDwtIEdPX3NpbWlsYXJpdHkoR1NFQV9JREgxX0lESDJAcmVzdWx0JElELCBvbnQgPSAiQlAiKQpgYGAKCmBgYHtyfQpzaW1wbGlmeUdPKEdvX3NpbWlsYXJpdGllc19JREgxX3ZzX0lESDIpCmBgYAoKCmBgYHtyLCBldmFsID0gRn0KIyBTaW1wbGlmeV9HT19JREgyIDwtIHNpbXBsaWZ5R08oR29fc2ltaWxhcml0aWVzJElESDIpCiMgU2ltcGxpZnlfR09fSURIMSA8LSBzaW1wbGlmeUdPKEdvX3NpbWlsYXJpdGllcyRJREgxKQpgYGAKCmBgYHtyLCBldmFsID0gRn0KbHQgPC0gbGlzdCgiSURIMiIgPSBlZ28kSURIMkByZXN1bHQsCiAgICAgICAgICAgIklESDEiID0gZWdvJElESDFAcmVzdWx0CiAgICAgICAgICAgKQpzaW1wbGlmeUdPRnJvbU11bHRpcGxlTGlzdHNfcmVzdWx0IDwtIHNpbXBsaWZ5R09Gcm9tTXVsdGlwbGVMaXN0cyhsdCwgcGFkal9jdXRvZmYgPSAwLjAwMSwgb250ID0gIkJQIikKc2ltcGxpZnlHT0Zyb21NdWx0aXBsZUxpc3RzX3Jlc3VsdCA8LSBzaW1wbGlmeUdPRnJvbU11bHRpcGxlTGlzdHMobHQsIHBhZGpfY3V0b2ZmID0gMC4wMDEsIG9udCA9ICJDQyIpCnNpbXBsaWZ5R09Gcm9tTXVsdGlwbGVMaXN0c19yZXN1bHQgPC0gc2ltcGxpZnlHT0Zyb21NdWx0aXBsZUxpc3RzKGx0LCBwYWRqX2N1dG9mZiA9IDAuMDAxLCBvbnQgPSAiTUYiKQpgYGAKCiMjIEdPCgpgYGB7ciwgZXZhbCA9IEZ9CmRvdHBsb3QoZWdvJElESDEpCmRvdHBsb3QoZWdvJElESDIpCmBgYAoKIyMgS0VHRwoKYGBge3J9CktFR0dfSURIIDwtIGdzZUtFR0coR2VuZXNldF9JREgxX3ZzX0lESDIsIG1pbkdTU2l6ZSA9IDIsIHB2YWx1ZUN1dG9mZiA9IDAuMSwgcEFkanVzdE1ldGhvZCA9ICJub25lIiwgdmVyYm9zZSA9IEYsIG9yZ2FuaXNtID0gJ2hzYScsIGtleVR5cGUgPSAnbmNiaS1nZW5laWQnKSAlPiUKICBzZXRSZWFkYWJsZShPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJFTlRSRVpJRCIpCgpoc2EwMDk4MiA8LSBwYXRodmlldyhnZW5lLmRhdGEgID0gR2VuZXNldF9JREgxX3ZzX0lESDIsCiAgICAgICAgICAgICAgICAgICAgIHBhdGh3YXkuaWQgPSAiaHNhMDA5ODIiLAogICAgICAgICAgICAgICAgICAgICBzcGVjaWVzICAgID0gImhzYSIsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0ICAgICAgPSBsaXN0KGdlbmU9bWF4KGFicyhHZW5lc2V0X0lESDFfdnNfSURIMikpLCBjcGQ9MSkpCgpoc2EwNDA2NCA8LSBwYXRodmlldyhnZW5lLmRhdGEgID0gR2VuZXNldF9JREgxX3ZzX0lESDIsCiAgICAgICAgICAgICAgICAgICAgIHBhdGh3YXkuaWQgPSAiaHNhMDQwNjQiLAogICAgICAgICAgICAgICAgICAgICBzcGVjaWVzICAgID0gImhzYSIsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0ICAgICAgPSBsaXN0KGdlbmU9bWF4KGFicyhHZW5lc2V0X0lESDFfdnNfSURIMikpLCBjcGQ9MSkpCgpoc2EwMDI2MCA8LSBwYXRodmlldyhnZW5lLmRhdGEgID0gR2VuZXNldF9JREgxX3ZzX0lESDIsCiAgICAgICAgICAgICAgICAgICAgIHBhdGh3YXkuaWQgPSAiaHNhMDAyNjAiLAogICAgICAgICAgICAgICAgICAgICBzcGVjaWVzICAgID0gImhzYSIsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0ICAgICAgPSBsaXN0KGdlbmU9bWF4KGFicyhHZW5lc2V0X0lESDFfdnNfSURIMikpLCBjcGQ9MSkpCgpoc2EwMDk4MyA8LSBwYXRodmlldyhnZW5lLmRhdGEgID0gR2VuZXNldF9JREgxX3ZzX0lESDIsCiAgICAgICAgICAgICAgICAgICAgIHBhdGh3YXkuaWQgPSAiaHNhMDA5ODMiLAogICAgICAgICAgICAgICAgICAgICBzcGVjaWVzICAgID0gImhzYSIsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0ICAgICAgPSBsaXN0KGdlbmU9bWF4KGFicyhHZW5lc2V0X0lESDFfdnNfSURIMikpLCBjcGQ9MSkpCgoKYGBgCgpgYGB7cn0KZG90cGxvdChLRUdHX0lESCwgc3BsaXQ9Ii5zaWduIikgKyBmYWNldF9ncmlkKC5+LnNpZ24sICkgCgpnZ3NhdmUoIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL1RyYW5zY3JpcHRvbWlxdWUvS0VHR19lbnJpY2htZW50X0lESDFfdnNfSURIMi5wbmciLCBiZyA9ICJ3aGl0ZSIsIHdpZHRoID0gNzYwMCwgaGVpZ2h0ID0gNDIwMCwgdW5pdHMgPSAicHgiKQoKY25ldHBsb3QoS0VHR19JREgsIGZvbGRDaGFuZ2U9R2VuZXNldF9JREgxX3ZzX0lESDIsIG5vZGVfbGFiZWwgPSAiYWxsIikgCgpnZ3NhdmUoIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL1RyYW5zY3JpcHRvbWlxdWUvS0VHR19jbmV0cGxvdF9lbnJpY2htZW50X0lESDFfdnNfSURIMi5wbmciLCBiZyA9ICJ3aGl0ZSIsIHdpZHRoID0gNzYwMCwgaGVpZ2h0ID0gNDIwMCwgdW5pdHMgPSAicHgiKQpgYGAKCgpgYGB7cn0KSURIX01LRUdHIDwtIGdzZU1LRUdHKGdlbmVMaXN0ID0gR2VuZXNldF9JREgxX3ZzX0lESDIsCiAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSAnaHNhJywKICAgICAgICAgICAgICAgICBwdmFsdWVDdXRvZmYgPSAxKSAlPiUKICBzZXRSZWFkYWJsZShPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJFTlRSRVpJRCIpCmBgYAoKYGBge3J9CmRvdHBsb3QoSURIX01LRUdHLCBzcGxpdD0iLnNpZ24iKSArIGZhY2V0X2dyaWQoLn4uc2lnbikKCmdnc2F2ZSgifi9HaXRIdWIvVGhlc2lzX3BhcGVyL1Jlc3VsdHMvVHJhbnNjcmlwdG9taXF1ZS9NS0VHR19lbnJpY2htZW50X0lESDFfdnNfSURIMi5wbmciLCBiZyA9ICJ3aGl0ZSIsIHdpZHRoID0gNzYwMCwgaGVpZ2h0ID0gNDIwMCwgdW5pdHMgPSAicHgiKQoKY25ldHBsb3QoSURIX01LRUdHLCBmb2xkQ2hhbmdlPUdlbmVzZXRfSURIMV92c19JREgyLCBub2RlX2xhYmVsID0gImFsbCIpIAoKZ2dzYXZlKCJ+L0dpdEh1Yi9UaGVzaXNfcGFwZXIvUmVzdWx0cy9UcmFuc2NyaXB0b21pcXVlL01LRUdHX2NuZXRwbG90X2VucmljaG1lbnRfSURIMV92c19JREgyLnBuZyIsIGJnID0gIndoaXRlIiwgd2lkdGggPSA3NjAwLCBoZWlnaHQgPSA0MjAwLCB1bml0cyA9ICJweCIpCmBgYAoKIyMgV2lraXBhdGh3YXkKCmBgYHtyfQpJREhfV0lLSSA8LSBnc2VXUChnZW5lTGlzdCA9IEdlbmVzZXRfSURIMV92c19JREgyLAogICAgICAgICAgICAgICAgIG9yZ2FuaXNtID0gJ0hvbW8gc2FwaWVucycsCiAgICAgICAgICAgICAgICAgcHZhbHVlQ3V0b2ZmID0gMSkgICU+JQogIHNldFJlYWRhYmxlKE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIkVOVFJFWklEIikKYGBgCgpgYGB7cn0KZG90cGxvdChJREhfV0lLSSwgc3BsaXQ9Ii5zaWduIikgKyBmYWNldF9ncmlkKC5+LnNpZ24pIAoKZ2dzYXZlKCJ+L0dpdEh1Yi9UaGVzaXNfcGFwZXIvUmVzdWx0cy9UcmFuc2NyaXB0b21pcXVlL1dJS0lfZW5yaWNobWVudF9JREgxX3ZzX0lESDIucG5nIiwgYmcgPSAid2hpdGUiLCB3aWR0aCA9IDc2MDAsIGhlaWdodCA9IDQyMDAsIHVuaXRzID0gInB4IikKCmNuZXRwbG90KElESF9XSUtJLCBmb2xkQ2hhbmdlPUdlbmVzZXRfSURIMV92c19JREgyLCBub2RlX2xhYmVsID0gImFsbCIpIAoKZ2dzYXZlKCJ+L0dpdEh1Yi9UaGVzaXNfcGFwZXIvUmVzdWx0cy9UcmFuc2NyaXB0b21pcXVlL1dpa2lfY25ldHBsb3RfZW5yaWNobWVudF9JREgxX3ZzX0lESDIucG5nIiwgYmcgPSAid2hpdGUiLCB3aWR0aCA9IDc2MDAsIGhlaWdodCA9IDQyMDAsIHVuaXRzID0gInB4IikKYGBgCgoKIyBPdmVycmVwcmVzZW50YXRpb24KCmBgYHtyfQpJREgxX3ZzX0lESDJfVVAgPC0gREVHc19JREggJT4lIGRwbHlyOjpmaWx0ZXIobG9nRkMgPiAxLjUgJiBQLlZhbHVlIDwgMC4wNSkgJT4lIC4kSUQgJT4lIHVuaXF1ZQpJREgxX3ZzX0lESDJfRE9XTiA8LSBERUdzX0lESCAlPiUgZHBseXI6OmZpbHRlcihsb2dGQyA8IC0xLjUgJiBQLlZhbHVlIDwgMC4wNSkgJT4lIC4kSUQgJT4lIHVuaXF1ZQpgYGAKCiMjIEdPCgpgYGB7cn0KSURIMV92c19JREgyX1VQX0dPIDwtIGVucmljaEdPKElESDFfdnNfSURIMl9VUCwgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIHVuaXZlcnNlID0gREVHc19JREgkSUQsIGtleVR5cGUgPSAiU1lNQk9MIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSkKSURIMV92c19JREgyX0RPV05fR08gPC0gZW5yaWNoR08oSURIMV92c19JREgyX0RPV04sIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCB1bml2ZXJzZSA9IERFR3NfSURIJElELCBrZXlUeXBlID0gIlNZTUJPTCIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUpCmBgYAoKCmBgYHtyfQpkb3RwbG90KElESDFfdnNfSURIMl9VUF9HTywgc3BsaXQ9Ii5zaWduIikgKyBmYWNldF9ncmlkKC5+LnNpZ24pIApkb3RwbG90KElESDFfdnNfSURIMl9ET1dOX0dPLCBzcGxpdD0iLnNpZ24iKSArIGZhY2V0X2dyaWQoLn4uc2lnbikgCmBgYAoKIyMgS0VHRwoKYGBge3J9Ck92ZXJyZXByZXNlbnRlZF9JREgxIDwtIGRwbHlyOjpmaWx0ZXIoYW5ub3RMb29rdXAsIGhnbmNfc3ltYm9sICVpbiUgSURIMV92c19JREgyX1VQKSAlPiUgCiAgLiRlbnRyZXpnZW5lX2lkICU+JSB1bmlxdWUKT3ZlcnJlcHJlc2VudGVkX0lESDIgPC0gZHBseXI6OmZpbHRlcihhbm5vdExvb2t1cCwgaGduY19zeW1ib2wgJWluJSBJREgxX3ZzX0lESDJfRE9XTikgJT4lIAogIC4kZW50cmV6Z2VuZV9pZCAlPiUgdW5pcXVlCnVuaXZlcnNlX2VudHJleiA8LSBkcGx5cjo6ZmlsdGVyKGFubm90TG9va3VwLCBoZ25jX3N5bWJvbCAlaW4lIHJvd25hbWVzKFJOQXNlcV9Lb2ljaGlfQmFzZWxpbmUpKSAlPiUgCiAgLiRlbnRyZXpnZW5lX2lkICU+JSB1bmlxdWUgJT4lIGFzLmNoYXJhY3RlcigpCmBgYAoKCmBgYHtyfQpJREgxX3ZzX0lESDJfVVBfS0VHRyA8LSBlbnJpY2hLRUdHKE92ZXJyZXByZXNlbnRlZF9JREgxLCBvcmdhbmlzbSA9ICJoc2EiLCB1bml2ZXJzZSA9IHVuaXZlcnNlX2VudHJleikgJT4lCiAgc2V0UmVhZGFibGUoT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiRU5UUkVaSUQiKQpJREgxX3ZzX0lESDJfRE9XTl9LRUdHIDwtIGVucmljaEtFR0coT3ZlcnJlcHJlc2VudGVkX0lESDIsIG9yZ2FuaXNtID0gImhzYSIsIHVuaXZlcnNlID0gdW5pdmVyc2VfZW50cmV6KSAlPiUKICBzZXRSZWFkYWJsZShPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJFTlRSRVpJRCIpCmBgYAoKYGBge3J9CmRvdHBsb3QoSURIMV92c19JREgyX1VQX0tFR0cpCmRvdHBsb3QoSURIMV92c19JREgyX0RPV05fS0VHRykgCmBgYAoKIyMgV2lraXBhdGh3YXkKCmBgYHtyfQpJREgxX3ZzX0lESDJfV0lLSVBBVEhfb3Zlcl91cCA8LSBlbnJpY2hXUChPdmVycmVwcmVzZW50ZWRfSURIMSwgb3JnYW5pc20gPSAiSG9tbyBzYXBpZW5zIikKSURIMV92c19JREgyX1dJS0lQQVRIX292ZXJfZG93biA8LSBlbnJpY2hXUChPdmVycmVwcmVzZW50ZWRfSURIMiwgb3JnYW5pc20gPSAiSG9tbyBzYXBpZW5zIikKYGBgCgpgYGB7cn0KZG90cGxvdChJREgxX3ZzX0lESDJfV0lLSVBBVEhfb3Zlcl91cCkKZG90cGxvdChJREgxX3ZzX0lESDJfV0lLSVBBVEhfb3Zlcl9kb3duKQpgYGAKCgpgYGB7cn0Kd3JpdGUudGFibGUoR1NFQV9JREgxX0lESDJAcmVzdWx0LCAifi9HaXRIdWIvVGhlc2lzX3BhcGVyL1Jlc3VsdHMvVHJhbnNjcmlwdG9taXF1ZS9HT19lbnJpY2htZW50X0lESDFfdnNfSURIMi50c3YiLCBzZXAgPSAiXHQiKQp3cml0ZS50YWJsZShLRUdHX0lESEByZXN1bHQsICJ+L0dpdEh1Yi9UaGVzaXNfcGFwZXIvUmVzdWx0cy9UcmFuc2NyaXB0b21pcXVlL0tFR0dfZW5yaWNobWVudF9JREgxX3ZzX0lESDIudHN2Iiwgc2VwID0gIlx0IikKd3JpdGUudGFibGUoSURIX01LRUdHQHJlc3VsdCwgIn4vR2l0SHViL1RoZXNpc19wYXBlci9SZXN1bHRzL1RyYW5zY3JpcHRvbWlxdWUvTUtFR0dfZW5yaWNobWVudF9JREgxX3ZzX0lESDIudHN2Iiwgc2VwID0gIlx0IikKd3JpdGUudGFibGUoSURIX1dJS0lAcmVzdWx0LCAifi9HaXRIdWIvVGhlc2lzX3BhcGVyL1Jlc3VsdHMvVHJhbnNjcmlwdG9taXF1ZS9XSUtJX2VucmljaG1lbnRfSURIMV92c19JREgyLnRzdiIsIHNlcCA9ICJcdCIpCmBgYAoKCgoKCgoK